/**
 * 
 * 类和类之间的关系：分别是关联(聚合和组合)、泛化和依赖
 * 关联
 */
export { }

// 关联
class Category {
    // 双向关联
    public products: Array<Product>;
}
class Product {
    //Product类有一个实例属性是Category类，那么就认为Product关联了Category类：1.单项关联、2.双向关联
    //单向关联
    public category: Category;
}



// 聚合
// 学校班级，班级里面聚集着一些学生，班级销毁，学生并不会消失。
class Class {
    public students: Array<Student>
}

// 学生
class Student {
    //如果是另外一个类是当前类的方法和属性或者 是局部变量就是依赖关系
    // 学生要读书，读书和不读书都可以
    read(book: Book) {
        let pen = new Pen();
    }
}
//依赖 
// 学生和book是依赖关系
class Book{}
// 钢笔
class Pen{}


// 组合
// 心脏
class Heart {

}
// 人，心脏和人是不可分割的一部分。
class Person {
    public heart: Heart;
}
//从弱到强   依赖>关联>聚合>组合




//尽量使用组合或者 聚合，而不是使用继承
class Cooker {
    cook() {

    }
}

//继承耦合太强
class Person2 {
    private cooker: Cooker;
    cook() {
        this.cooker.cook();
    }
}